/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ecom.dao;

import ecom.exception.DataAccessLayerException;
import ecom.entity.ProductStore;
import ecom.entity.ProductStorePK;
import ecom.entity.Store;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.criterion.Expression;

/**
 *
 * @author
 */
public class ProductStoreDAO extends AbstractDAO {

    private final static String STORE = "store";
    private final static String ID_PRODUCT = "product_id";

    public ProductStoreDAO() {
        super();
    }

    /**
     * Crée un nouveau ProductStore
     * @param ps ProductStore à créer
     */
    public void create(ProductStore ps) throws DataAccessLayerException {
        super.saveOrUpdate(ps);
    }

    /**
     * Supprime un ProductStore de la base de données
     * @param ps ProductStore à supprimer
     */
    public void delete(ProductStore ps) throws DataAccessLayerException {
        super.delete(ps);
    }

    /**
     * Retourne le ProductStore en fonction de sa clé primaire
     * @param id id du ProductStore
     * @return ProductStore Retourne le ProductStore correspondant
     */
    public ProductStore find(ProductStorePK pk) throws DataAccessLayerException {
        startOperation();

        return (ProductStore) session.load(ProductStore.class, pk);
        
    }

    /**
     * Mettre à jour un ProductStore.
     * @param ps ProductStore à mettre à jour
     */
    public void update(ProductStore ps) throws DataAccessLayerException {
        super.saveOrUpdate(ps);
    }

    /**
     * Retourne tous les ProductStore de la base de données
     * @return <ProductStore> Retourne une liste de ProductStore
     */
    public List<ProductStore> findAll() throws DataAccessLayerException {
        return super.findAll(ProductStore.class);
    }

    /**
     * Retourne tous les ProductStore d'un Store en fonction d'un produit
     * @param  idProduct id du produit
     * @return <ProductStore> Retourne une liste de ProductStore
     */
    public List<ProductStore> findStoresByProduct(int idProduct) throws DataAccessLayerException {
        List<ProductStore> ps = null;
        try {
            startOperation();
            Criteria crit = session.createCriteria(ProductStore.class);
            crit.add(Expression.eq(ID_PRODUCT, idProduct));
            ps = crit.list();
            tx.commit();
        } catch (HibernateException e) {
            handleException(e);
        }
        return ps;
    }

    /**
     * Retourne tous les ProductStore d'un Store en fonction d'un store
     * @param  idProduct id du sotre
     * @return <ProductStore> Retourne une liste de ProductStore
     */
    public List<ProductStore> findProductsByStore(int idStore) throws DataAccessLayerException {
        List<ProductStore> ps = null;
        try {
            startOperation();
            Criteria crit = session.createCriteria(ProductStore.class);
            crit.add(Expression.eq(STORE, new Store(idStore)));
            ps = crit.list();
            tx.commit();
        } catch (HibernateException e) {
            handleException(e);
        }
        return ps;
    }
}
